package storage.io;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

import storage.StorageException;
import storage.manager.DatabaseManager;


/**
 * 数据库文件管理工具（重构版）
 * 新职责：
 * 1. 数据库文件生命周期管理（创建/备份/删除）
 * 2. 数据库存储目录维护
 * 3. 数据迁移工具
 */
public class FileManager {
    public static final String DB_EXTENSION =".db";
    public static final String DB_ROOT = "DBMS_ROOT";

    /**
     * 初始化数据库存储目录
     * 调用时机：StorageEngine类加载时自动执行
     */
    public static void initDBRoot() {
        File dbDir = new File(DB_ROOT);
        if (!dbDir.exists()) {
            if (!dbDir.mkdirs()) {
                throw new StorageException("无法创建数据库目录: " + dbDir.getAbsolutePath());
            }
            System.out.println("✅ 初始化数据库目录: " + dbDir.getAbsolutePath());
        }
    }

    /**
     * 备份数据库文件（新增）
     * @param dbName 数据库名称
     * @param backupPath 备份路径
     */
    public static boolean backupDatabase(String dbName, String backupPath) {
        File src = new File(DB_ROOT + File.separator + dbName + DB_EXTENSION);
        File dest = new File(backupPath);
        try {
            Files.copy(src.toPath(), dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
            return true;
        } catch (Exception e) {
            throw new StorageException("数据库备份失败: " + e.getMessage(), e);
        }
    }

    /**
     * 检查系统级操作锁状态
     */
    public static boolean isSystemLocked() {
        return DatabaseManager.dbLock.isLocked();
    }

    /**
     * 获取数据库完整存储路径
     * @param dbName 数据库名称
     * @param username 可选用户名，不提供则使用通用路径
     * @return 标准化的数据库存储路径
     */
    public static String getDBPath(String dbName, String... username) {
        // 系统数据库直接存储在根目录
        if ("system_db".equals(dbName)) {
            return DB_ROOT + File.separator;
        }
        
        // 检查是否提供了用户名
        String user = (username.length > 0 && username[0] != null) ? username[0] : null;
        
        if (user == null || user.isEmpty()) {
            // 如果没有用户名，使用根目录
            return DB_ROOT + File.separator;
        }
        
        // 使用用户特定路径
        Path userDBPath = Paths.get(DB_ROOT, "USER", user);
        ensureDirectoryExists(userDBPath.toFile());
        return userDBPath + File.separator;
    }
    
    /**
     * 确保目录存在，如不存在则创建
     * @param dir 目录对象
     */
    private static void ensureDirectoryExists(File dir) {
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                throw new StorageException("无法创建目录: " + dir.getAbsolutePath());
            }
        }
    }

    /**
     * 递归删除目录及其内容
     * @param directoryPath 要删除的目录的路径
     * @return 如果删除成功则返回 true，否则返回 false
     */
    public static boolean deleteDirectory(Path directoryPath) {
        try {
            if (Files.exists(directoryPath)) {
                Files.walk(directoryPath)
                    .sorted(java.util.Comparator.reverseOrder())
                    .map(Path::toFile)
                    .forEach(File::delete);
                return true;
            }
            return false; // 目录不存在，也算删除成功（或无操作）
        } catch (java.io.IOException e) {
            System.err.println("Failed to delete directory: " + directoryPath + " - " + e.getMessage());
            e.printStackTrace(); // For more detailed debugging
            // 可以选择抛出自定义异常或返回false
            // throw new StorageException("无法删除目录: " + directoryPath, e);
            return false;
        }
    }
}
